package com.krystal.crawler;

import com.alibaba.fastjson.JSON;
import com.core.var.Constants;
import com.krystal.bean.CovidChinaDayBean;
import com.krystal.mapper.DataMapper;
import com.krystal.services.SpiderMsgService;
import com.krystal.util.HttpUtils;
import com.krystal.util.TimeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Krystal1
 * @date 2021/4/25 -14:25
 * 实现疫情数据爬取                     该类爬取腾讯疫情数据
 *
 * 逻辑：抓取的近两个月的数据 策略是直接清空表 然后插入这两个月的数据  接口稳定不需要更改地址
 */
@Slf4j
@Component
public class Covid19DateCrawlerImportCase {
    public static DataMapper mapper;
    /**腾讯新闻疫情信息接口地址*/
    public static String  URL = "https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList";

    static {

        InputStream resourceAsStream;
        try {
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            mapper = sqlSession.getMapper(DataMapper.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 爬取近两个月的中国大致数据(包括输入病例)并存入covid19_0表中  无需参数
     * @return Response
     */
    public SpiderMsgService.Response crawlImportCaseData(){
        /**响应消息*/
        SpiderMsgService.Response response = new SpiderMsgService.Response();
        String datetime = TimeUtils.format(System.currentTimeMillis(), "yyyy-MM-dd");
        //1.爬取指定页面
        String html = HttpUtils.getHtml(URL);
        //log.info(html);  //爬取の报文
        //2.解析页面中的指定内容,即id为getAreaStat的标签中的全国疫情数据
        Document doc = Jsoup.parse(html);
        String text = doc.toString();
        //log.info(text);

        //3.使用正则表达式获取json格式的疫情数据
        String pattern = "\\[(.*)\\]";              //定义正则规则            ""
        Pattern reg = Pattern.compile(pattern);     //编译成正则对象
        Matcher matcher = reg.matcher(text);        //去text中进行匹配
        String jsonStr = "";
        if (matcher.find()) {                         //如果text中的内容和正则规则匹配上就取出来赋值给jsonStr变量
            jsonStr = matcher.group(0);
            log.info("json报文:{}",jsonStr);
        } else {
            log.info("no match");
            response.setIsUpdated("0");
            response.setReturnMsg("正则表达式：no match");
            return  response;
        }

        //4.对json数据进行更进一步的解析，并更新进入数据库中
        List<CovidChinaDayBean> covidChinaDayBeans = JSON.parseArray(jsonStr, CovidChinaDayBean.class);//省份的
        log.info("爬取数据共{}条数据",covidChinaDayBeans.size());
        //5.清空covic19_0的数据
        mapper.truncateTable("covid19_0");
        log.info("已清空covid19_0表数据");

        int currentCount = mapper.selectDataChinaDay(); //数据库中有的数据量
        log.info("covid19_0表数据共{}条",currentCount);
        if (currentCount == 0) {            //数据库中没有数据那就直接全部添加
            log.info("更新数据库中，请勿结束程序~");
            for (CovidChinaDayBean covidChinaDayBean : covidChinaDayBeans) {
                mapper.insertInitChinaDay(covidChinaDayBean);
            }
            /**执行完后数据条数*/
            int currentSize = mapper.selectDataChinaDay();
            log.info("更新数据完毕~");
            log.info("covid19_0表数据共{}条",currentSize);

            response.setIsUpdated("1");//更新成功
            response.setUpdateCount(currentSize + "");
            response.setReturnCode(Constants.SUCCESS_CODE);//000000
            response.setReturnMsg("本地数据插入成功!");
        }
        return response;
    }


    /**
     * 测试类  已经弃用
     * @param args
     */
    public static void main(String[] args) {
        String datetime = TimeUtils.format(System.currentTimeMillis(), "yyyy-MM-dd");

        //1.爬取指定页面
        String html = HttpUtils.getHtml(URL);
        //System.out.println(html);

        //2.解析页面中的指定内容,即id为getAreaStat的标签中的全国疫情数据
        Document doc = Jsoup.parse(html);
        String text = doc.toString();
        //System.out.println(text);

        //3.使用正则表达式获取json格式的疫情数据
        String pattern = "\\[(.*)\\]";              //定义正则规则            ""
        Pattern reg = Pattern.compile(pattern);     //编译成正则对象
        Matcher matcher = reg.matcher(text);        //去text中进行匹配
        String jsonStr = "";
        if (matcher.find()) {                         //如果text中的内容和正则规则匹配上就取出来赋值给jsonStr变量
            jsonStr = matcher.group(0);
            log.info("json报文:{}",jsonStr);
        } else {
            log.info("no match");
        }

        //4.对json数据进行更进一步的解析，并更新进入数据库中

        List<CovidChinaDayBean> covidChinaDayBeans = JSON.parseArray(jsonStr, CovidChinaDayBean.class);//省份的

        //5.清空covic19_0的数据
        mapper.truncateTable("covid19_0");

        int currentCount = mapper.selectDataChinaDay(); //数据库中有的数据量
        if (currentCount == 0) {            //数据库中没有数据那就直接全部添加
            for (CovidChinaDayBean covidChinaDayBean : covidChinaDayBeans) {
                mapper.insertInitChinaDay(covidChinaDayBean);
            }
        }
        log.info("数据更新完毕");
    }
}
